package main

import (
	"fmt"
	"net"
	"net/rpc"
)

type World struct {
}

// Hello 定义一个可远程调用的方法
/*
	req ： func ==> 表示客户端传过来的内容, 请求参数 不能是channel ,complex,
	res :  func ==>给客户端返回的内容, 必填 必须是带指针的string 不能是channel ,complex,
	return : 必须返回 err
	ps : 必须是公开方法
*/
func (w World) Hello(req string, res *string) error {
	*res = "Hello RPC " + req
	return nil
}
func main() {
	fmt.Println("执行 rpc 服务端创建流程开始")
	// 注册 rpc 服务
	err1 := rpc.RegisterName("Hello", new(World))
	if err1 != nil {
		fmt.Println(err1)
	}
	// 监听端口
	listener, err2 := net.Listen("tcp", "localhost:9999")
	if err2 != nil {
		fmt.Println(err2)
	}
	// 应用退出时, 关闭监听
	defer func(listener net.Listener) {
		err := listener.Close()
		if err != nil {
			fmt.Println(err)
		}
	}(listener)

	// 建立连接
	for {
		fmt.Println("开始建立 rpc 连接")
		accept, err3 := listener.Accept()
		if err3 != nil {
			fmt.Println(err3)
		}
		// 绑定服务
		rpc.ServeConn(accept)
		// 结果返回
		fmt.Println("本次 rpc 调用结束")
	}

}
